import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score, roc_curve, roc_auc_score, confusion_matrix
from sklearn.preprocessing import MinMaxScaler

# 读取数据
df = pd.read_excel('C:/Users/Administrator/Desktop/信用卡精准营销模型.xlsx')

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
# 数据处理部分
# 1. 检查数据完整性
print("数据缺失情况：")
print(df.isnull().sum())  # 查看每列的缺失值数量

# 如果有缺失值，可以根据情况选择填充或删除
# 填充缺失值为列的均值
# df.fillna(df.mean(), inplace=True)

# 删除包含缺失值的行
# df.dropna(inplace=True)

# 2. 数据类型检查
print("\n数据类型：")
print(df.dtypes)  # 查看每列的数据类型

# 如果需要，可以将某些列转换为数值类型
# df['某列'] = pd.to_numeric(df['某列'], errors='coerce')

# 3. 数据标准化或归一化
scaler = MinMaxScaler()
df[['月收入（元）', '月消费（元）']] = scaler.fit_transform(df[['月收入（元）', '月消费（元）']])



# 提取特征变量和目标变量
X = df.drop(columns='响应')
y = df['响应']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)

# 模型训练及搭建
clf = AdaBoostClassifier(random_state=123)
clf.fit(X_train, y_train)

# 模型预测与评估
y_pred = clf.predict(X_test)
score = accuracy_score(y_test, y_pred)
print(f"\n准确率：{score}")

# 绘制ROC曲线评估模型预测效果
y_pred_proba = clf.predict_proba(X_test)
fpr, tpr, thres = roc_curve(y_test.values, y_pred_proba[:, 1])
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, label=f'ROC Curve (AUC = {roc_auc_score(y_test, y_pred_proba[:, 1]):.2f})')
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend()
plt.show()

# 计算AUC值
score_auc = roc_auc_score(y_test, y_pred_proba[:, 1])
print(f"\nAUC值：{score_auc}")

# 特征重要性评估
features = X.columns
importances = clf.feature_importances_

# 通过二维表格形式显示
importances_df = pd.DataFrame()
importances_df['特征名称'] = features
importances_df['特征重要性'] = importances
importances_df = importances_df.sort_values('特征重要性', ascending=False)
print("\n特征重要性：")
print(importances_df)

# 特征重要性可视化
plt.figure(figsize=(10, 6))
sns.barplot(x='特征重要性', y='特征名称', data=importances_df)
plt.title('特征重要性')
plt.show()

# 混淆矩阵可视化
conf_matrix = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(6, 6))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=['未响应', '响应'], yticklabels=['未响应', '响应'])
plt.xlabel('预测值')
plt.ylabel('实际值')
plt.title('混淆矩阵')
plt.show()

# 数据分布可视化
plt.figure(figsize=(12, 8))
sns.pairplot(df, hue='响应', vars=['年龄', '月收入（元）', '月消费（元）', '性别', '月消费/月收入'])
plt.suptitle('数据分布')
plt.show()